package view.rules;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Collections;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

import ruletree.RuleTree;

import view.grammardevelopment.MainFrame;
import net.miginfocom.swing.MigLayout;

public class RuleTreePanel extends JPanel implements ActionListener{
	
	private JPanel panel;
	private JPanel displayPanel;
	private JButton structAdjRulePanel;
	private JButton spelledOutPanel;
	private JButton featureCopyPanel;
	private JButton phraseStructurePanel;
	
	JPanel displayTreePanel;
	
	
	private RuleTree ruleTree;
	
	private RuleTreePanel(RuleTree ruleTree){
		this.ruleTree = ruleTree;
	}
	
	public RuleTreePanel(){
		
		initComponent();
		displayTree();
		addComponent();
	}
	
	private void displayTree(){
		
		displayTreePanel = new JPanel();
		
		File dir = new File("Languages\\Filipino\\RuleTree"); 
		
		 displayTreePanel.setLayout(new BorderLayout());
		 JTree tree = new JTree(addNodes(null, dir));

		    // Add a listener
		    tree.addTreeSelectionListener(new TreeSelectionListener() {
		      public void valueChanged(TreeSelectionEvent e) {
		        DefaultMutableTreeNode node = (DefaultMutableTreeNode) e
		            .getPath().getLastPathComponent();
		        System.out.println("You selected " + node);
		      }
		    });
		    
		    JScrollPane scrollpane = new JScrollPane();
		    scrollpane.getViewport().add(tree);
		    displayTreePanel.add(BorderLayout.CENTER, scrollpane);
	}
	
	
	 DefaultMutableTreeNode addNodes(DefaultMutableTreeNode curTop, File dir) {
		    String curPath = dir.getPath();
		    DefaultMutableTreeNode curDir = new DefaultMutableTreeNode(curPath);
		    if (curTop != null) { // should only be null at root
		      curTop.add(curDir);
		    }
		    Vector ol = new Vector();
		    String[] tmp = dir.list();
		    for (int i = 0; i < tmp.length; i++)
		      ol.addElement(tmp[i]);
		    Collections.sort(ol, String.CASE_INSENSITIVE_ORDER);
		    File f;
		    Vector files = new Vector();
		    // Make two passes, one for Dirs and one for Files. This is #1.
		    for (int i = 0; i < ol.size(); i++) {
		      String thisObject = (String) ol.elementAt(i);
		      String newPath;
		      if (curPath.equals("."))
		        newPath = thisObject;
		      else
		        newPath = curPath + File.separator + thisObject;
		      if ((f = new File(newPath)).isDirectory())
		        addNodes(curDir, f);
		      else
		        files.addElement(thisObject);
		    }
		    // Pass two: for files.
		    for (int fnum = 0; fnum < files.size(); fnum++)
		      curDir.add(new DefaultMutableTreeNode(files.elementAt(fnum)));
		    return curDir;
		  }

	private void initComponent() {
		
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		
		panel = new JPanel();	
		panel.setLayout(new MigLayout());
		
		displayPanel = new JPanel();
		
		structAdjRulePanel = new JButton("StructAdjRulePanel");
		structAdjRulePanel.addActionListener(this);
		spelledOutPanel = new JButton("SpelledOutPanel");
		spelledOutPanel.addActionListener(this);
		featureCopyPanel = new JButton("FeatureCopyPanel");
		featureCopyPanel.addActionListener(this);
		phraseStructurePanel = new JButton("PhraseStructurePanel");
		phraseStructurePanel.addActionListener(this);
		
	}

	private void addComponent() {
		
		addToPanel();
		add(panel);
		add(displayTreePanel);
		
	}
	
	private void addToPanel(){
		panel.add(structAdjRulePanel, "wrap");
		panel.add(spelledOutPanel, "wrap");
		panel.add(featureCopyPanel, "wrap");
		panel.add(phraseStructurePanel, "wrap");
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() == structAdjRulePanel){
			displayPanel = new AddRulePanel("structAdjRulePanel");
		}
		
		if (e.getSource() == spelledOutPanel){			
			displayPanel = new AddRulePanel("spelledOutPanel");			
		}		
		
		if (e.getSource() == featureCopyPanel){			
			displayPanel = new AddRulePanel("featureCopyPanel");			
		}
		
		if (e.getSource() == phraseStructurePanel){
			displayPanel = new AddRulePanel("phraseStructurePanel");
		}
		
		if (displayPanel != null)
			MainFrame.getInstance().setPanel(displayPanel);
	}
	

}
